package com.nkzy.controller;

import com.nkzy.pojo.Result;
import com.nkzy.pojo.User;
import com.nkzy.service.UserService;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 这是一个盒用户相关的控制权，主要完成前后端进行交互
 * 成为控制器类有两个注解：@Controller：表示是控制器类，但返回值是字符串
 * @RestController:表示是控制器类，但返回值是json数据
 * 后端开发是按照三层架构类进行的
 * 1.Mapper:数据访问层，需要写sql语句，完成对表的操作
 * 在这一层所有的方法写完，需要进行单元测试
 * 2.Service:业务逻辑层，这一层主要完成业务功能
 * 在这层需要调用Mapper的方法，所有需要注入Mapper对象
 * 在这一层编写完成，需要进行单元测试
 * Controller：控制层，又称表现层，时前端与后端交互的桥梁
 * 在这层需要进行接口测试
 * 常用的接口测试工具：Postman、JMetter
 * 我们使用Posman进行接口测试
 * JMetter也可以进行接口测试，又能进行性能测试
 */
@RestController
@RequestMapping("/user")//请求路径
@Validated
public class UserController {
    //控制器层要使用业务层对象应该怎么用？依赖注入
    @Autowired//依赖注入
    private UserService userService;

    //在类中编写盒用户相关的所有方法，这些方法我们就叫接口
    //注册接口(方法)：方法的返回值是result，参数是：username，password
    @PostMapping("/register")
    public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,
                           @Pattern(regexp = "^\\S{5,16}$")String password) {
            //1.控制器层要调用业务层的方法（根据用户名查找用户的方法），
            //在业务层有一个根据用户名查找用户的方法，查到用户返回
            User u = userService.findUserByName(username);
            //判断用户是否存在
            if (u == null) {
                //用户没有被占用，进行注册
                userService.register(username, password);
                //注册成功
                return Result.success();
            } else {
                //用户被 占用
                return Result.error("用户名已被占用");
            }
        }
}






































